package com.barney.support.web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 웹용 목록.<br/>
 * JSP 태그 라이브러리 등을 사용할 때 UI를 위해서 List의 크기를 얻어야 하는 경우등을 위하여 사용한다.
 *
 * @author Barney Kim
 */
public class WebList<E> implements Serializable {

	private static final long serialVersionUID = 2240592342730329504L;

	/** 전체 개수 */
	private long total;

	/** 목록 */
	private List<E> list;

	/**
	 * 새로운 웹 목록을 생성한다.
	 */
	public WebList() {
	}

	/**
	 * 새로운 웹 목록을 생성한다.
	 *
	 * @param list 목록
	 */
	public WebList(List<E> list) {
		this.list = list;
	}

	/**
	 * 전체 개수를 반환한다.
	 *
	 * @return 만약 전체 개수가 0이고 목록 크기가 0보다 크면 목록 크기를 반환한다.
	 */
	public long getTotal() {
		return (total == 0 && getSize() > 0) ? getSize() : total;
	}

	/**
	 * 전체 개수를 설정한다.
	 */
	public void setTotal(long i) {
		this.total = i;
	}

	/**
	 * 목록 크기를 반환한다.
	 */
	public int getSize() {
		return (list == null) ? 0 : list.size();
	}

	/**
	 * 목록을 반환한다.
	 *
	 * @return 목록이 <tt>null</tt> 이면{@link java.util.Collections#emptyList()}로
	 *         반환한다.
	 */
	public List<E> getList() {
		if (list == null) {
			return Collections.emptyList();
		}
		return this.list;
	}

	/**
	 * 목록을 설정한다.
	 */
	public void setList(List<E> l) {
		this.list = l;
	}

	/**
	 * 전체 개수가 0인지 여부를 반환한다.
	 */
	public boolean isEmpty() {
		return (getTotal() == 0);
	}

	/**
	 * 전체 개수가 0보다 큰지 여부를 반환한다.
	 */
	public boolean isNotEmpty() {
		return !isEmpty();
	}

	/**
	 * 목록에 객체를 추가한다. 만약 목록이 <tt>null</tt> 이면 {@link java.util.ArrayList}를 사용하여
	 * 목록을 생성하여 추가한다.
	 *
	 * @param o 객체
	 */
	public void add(E o) {
		if (list == null) {
			list = new ArrayList<E>();
		}
		list.add(o);
	}

	/**
	 * 목록의 해당 색인에 있는 객체를 리턴한다.
	 */
	public E get(int i) {
		return list.get(i);
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("WebList [total=").append(getTotal()).append(", list=").append(list)
				.append("]");
		return builder.toString();
	}
}